루비 (프로그래밍 언어)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
루비는 마츠모토 유키히로가 1990년대에 개발한 객체 지향 프로그래밍 언어이다. 1995년 첫 릴리스 이후, 간결하고 유연한 구문, 완전한 객체 지향성, 메타프로그래밍 기능 등을 특징으로 한다. 루비는 Lisp의 단순함, Smalltalk의 객체 시스템, Perl의 실용성을 결합하여 설계되었으며, 프로그래머의 생산성과 즐거움을 중시하는 철학을 가지고 있다. 루비는 다양한 운영체제에서 실행되며, JRuby, Rubinius, mruby 등 여러 구현체가 존재한다. 루비 온 레일즈(Ruby on Rails) 웹 프레임워크는 루비의 인기를 높이는 데 크게 기여했으며, 현재 웹 개발, 시스템 관리 등 다양한 분야에서 활용되고 있다. 한국에서도 루비 온 레일즈를 중심으로 웹 개발 분야에서 사용되며, 관련 커뮤니티와 컨퍼런스가 활발히 운영되고 있다. 루비는 성능 문제와 관련하여 비판을 받기도 하지만, JIT 컴파일러 도입 등 지속적인 성능 개선 노력을 통해 단점을 극복해나가고 있다.
더 읽어볼만한 페이지
- 1995년 개발된 프로그래밍 언어 - PHP
PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다. - 1995년 개발된 프로그래밍 언어 - 자바 (프로그래밍 언어)
자바는 제임스 고슬링 등에 의해 개발된 객체 지향 프로그래밍 언어로, 다양한 플랫폼에서 실행 가능하며 샌드박스 모델 기반의 보안 기능, 자동 메모리 관리, 멀티스레딩 등을 지원한다. - 루비 (프로그래밍 언어) - 마츠모토 유키히로
마츠모토 유키히로는 루비 프로그래밍 언어를 창시하고 주요 개발자로 활동하며 MRI, mruby, streem 등 다양한 프로그래밍 언어 및 관련 기술 개발에 기여한 인물로, 오픈소스 소프트웨어 커뮤니티에 대한 공헌과 루비 온 레일즈의 성공으로 세계적인 인정을 받았다. - 루비 (프로그래밍 언어) - 루비포지
루비포지는 루비 센트럴이 운영하며 오픈 소스 루비 언어 관련 홍보를 지원하는 웹사이트였으나, 2014년 5월 15일에 서비스가 종료되었다. - 동적 프로그래밍 언어 - PHP
PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다. - 동적 프로그래밍 언어 - 펄
펄은 래리 월이 개발한 텍스트 조작에 강점을 가진 다목적 프로그래밍 언어이며, 1987년 펄 1.0이 처음 공개된 이후 여러 버전 업데이트를 거쳐 객체 지향 프로그래밍과 유니코드 지원 기능을 추가했고, 현재 펄 5가 널리 사용되며 CPAN을 통해 방대한 모듈 생태계를 제공한다.
루비 (프로그래밍 언어) - [IT 관련 정보]에 관한 문서 | |
---|---|
개요 | |
![]() | |
패러다임 | 다중 패러다임 프로그래밍: 함수형 프로그래밍, 명령형 프로그래밍, 객체 지향 프로그래밍, 반사 프로그래밍 |
설계자 | 마츠모토 유키히로 |
개발자 | 마츠모토 유키히로 외 |
발표 연도 | 1995년 |
최신 안정화 버전 날짜 | }} |
타이핑 | 덕 타이핑, 동적 타이핑, 강한 타이핑 |
적용 범위 | 어휘, 때로는 동적 |
구현체 | Ruby MRI, TruffleRuby, YARV, Rubinius, JRuby, RubyMotion, mruby |
영향을 준 언어 | Clojure, CoffeeScript, Crystal, D, Elixir, Groovy, Julia, Mirah, Nu, Ring, Rust, Swift |
라이선스 | Ruby License |
웹사이트 | ruby-lang.org |
프로그래밍 언어 | C |
영향을 받은 언어 | Ada, Basic, C++, CLU, Dylan, Eiffel, Lisp, Lua, Perl, Python, Smalltalk |
운영체제 | 크로스 플랫폼 |
파일 확장자 | .rb, .ru |
2. 역사
마쓰모토 유키히로는 스트레스 없는 쉬운 프로그래밍을 추구하며 루비를 개발했다. 그는 프로그래밍 언어가 인간 중심으로 설계되어야 한다고 강조했다.[9]
루비는 인터프리터 형식으로 실행되는 고기능 스크립트 언어이자 뛰어난 객체 지향 언어이다. 가독성이 뛰어난 대표적인 스크립트 언어로는 파이썬이 있다. 루비와 파이썬은 유사성으로 인해 사용자 간 논쟁을 일으키기도 했지만, 대체로 기술적인 세부 사항에 집착한 의미 없는 논쟁이었다.
일본에서는 루비 개발자가 일본인이기 때문에 루비의 인기가 높고 관련 서적도 많이 출판되고 있다. 2004년까지는 루비로 작성된 킬러 애플리케이션이 없었지만, 2004년 말에 발표된 루비 온 레일즈가 2005년에 폭발적인 인기를 얻으면서 루비는 큰 주목을 받게 되었다.
루비는 1993년 2월 24일에 탄생하여 1995년 12월에 fj를 통해 발표되었다. "루비"라는 이름은 펄(Perl) (6월의 탄생석인 진주)에 이어 7월의 탄생석인 루비에서 따왔다.[9] 파이썬(Python)에 만족했다면 루비는 태어나지 않았을 것이라는 언급도 있다.[9]
루비는 클래스 정의, 가비지 컬렉션, 정규 표현식 처리, 멀티 스레드, 예외 처리, 이터레이터, 클로저, Mixin, 사용자 정의 연산자 등의 기능을 제공하며, 펄을 대체할 수 있는 점이 초기부터 중요하게 여겨졌다. C 언어 프로그램이나 라이브러리를 호출하는 확장 모듈을 통합할 수 있는 글루 언어로도 사용 가능하다.
루비 처리기는 인터프리터와 컴파일러가 존재한다.
가독성을 중시한 구문을 가지며, 정수나 문자열 등을 포함한 모든 데이터 타입은 객체이다. 즉, 순수한 객체 지향 언어라고 할 수 있다.
오랫동안 언어 사양이 명문화되지 않았으나, 2010년부터 RubySpec이라는 명문화 시도가 진행되었다. 2011년에는 JIS 규격(JIS X 3017), 2012년에는 ISO/IEC 규격(ISO/IEC 30170)으로 승인되었다.[8]
자유 소프트웨어로서 버전 1.9.2까지는 루비 라이선스 (GPL 또는 Artistic와 유사)로 배포되었으나, 버전 1.9.3 이후는 2-clause BSDL과의 이중 라이선스로 배포되고 있다.[10]
2. 1. 개발 배경
마쓰모토 유키히로는 1993년에 루비를 구상했다. 그는 1999년 ''ruby-talk'' 메일링 리스트에 올린 글에서 객체 지향 스크립팅 언어에 대한 초기 아이디어를 다음과 같이 설명했다.마쓰모토는 루비의 설계를 Lisp 언어와 같고, 고차 함수에서 영감을 받은 블록, 스몰토크와 같은 객체 시스템, 펄과 같은 실용성을 갖춘 것으로 묘사한다.
"루비"라는 이름은 1993년 2월 24일 마쓰모토와 이시쓰카 게이주 간의 온라인 채팅 세션에서 처음 제안되었으며, 언어에 대한 코드가 작성되기 전이었다. 처음에는 "Coral"과 "Ruby" 두 개의 이름이 제안되었다. 마쓰모토는 나중에 이시쓰카에게 보낸 이메일에서 후자를 선택했다. 마쓰모토는 "루비"라는 이름을 선택한 요인 중 하나가 그의 동료 중 한 명의 탄생석이었기 때문이라고 언급했다.
루비는 1993년 2월 24일에 탄생하여 1995년 12월에 fj를 통해 발표되었다. 루비라는 이름은 프로그래밍 언어 펄(Perl)이 6월의 탄생석인 Pearl(진주)과 발음이 같으며, "펄(Perl)에 이어서"라는 의미로 6월 다음의 탄생석(7월)인 루비에서 따왔다.[9] 경쟁 언어로는 펄 외에 파이썬(Python)이 있으며, "Matz(마쓰모토)가 파이썬(Python)에 만족했다면 루비는 태어나지 않았을 것이다"라고 공식 레퍼런스의 용어집에서 언급하고 있다.[9]
2. 2. 초기 버전 (1995년 ~ 2000년)
루비 0.95의 첫 공개 릴리스는 1995년 12월 21일 일본 국내 뉴스그룹에 발표되었다. 이후 2일 만에 세 개의 루비 버전이 더 출시되었다. 이 출시는 새로운 언어를 위한 첫 번째 메일링 리스트인 일본어 ''ruby-list'' 메일링 리스트의 시작과 일치했다.이 개발 단계에서 이미 객체 지향 프로그래밍, 상속을 포함한 클래스, 믹스인, 이터레이터, 클로저, 예외 처리 및 가비지 컬렉션을 포함하여 루비의 이후 릴리스에서 익숙한 많은 기능이 존재했다.
1995년 루비 0.95가 출시된 후, 다음과 같은 몇 가지 안정적인 버전의 루비가 출시되었다.
버전 | 출시일 |
---|---|
루비 1.0 | 1996년 12월 25일 |
루비 1.2 | 1998년 12월 |
루비 1.4 | 1999년 8월 |
루비 1.6 | 2000년 9월 |
1997년에 루비에 대한 첫 번째 기사가 웹에 게재되었다. 같은 해, 마츠모토는 루비 전담 개발자로 netlab.jp에 고용되었다.
1998년, 마츠모토에 의해 루비 응용 프로그램 아카이브가 시작되었고, 루비를 위한 간단한 영어 홈페이지도 함께 개설되었다.
1999년, 첫 번째 영어 메일링 리스트 ''ruby-talk''가 시작되어 일본 외 지역에서 언어에 대한 관심이 증가하고 있음을 알렸다.
2. 3. Ruby 1.8 및 1.9 (2003년 ~ 2011년)
루비 1.8은 2003년 8월에 처음 출시되어 오랫동안 안정적으로 사용되었으나, 2013년 6월에 지원이 중단되었다. 루비 1.8은 루비 1.9와 부분적으로만 호환된다.루비 1.8은 여러 산업 표준의 대상이 되었다. 일본 정부 기관인 정보 처리 진흥 기구(IPA)의 개방형 표준 진흥 센터에서 개발하여 일본 산업 표준 위원회(JISC)에 제출되었고, 이후 국제 표준화 기구(ISO)에 제출되었다. 2011년에는 일본 산업 표준(JIS X 3017)으로, 2012년에는 국제 표준(ISO/IEC 30170)으로 채택되었다.
2005년경, 루비로 작성된 웹 프레임워크인 루비 온 레일즈와 함께 루비 언어에 대한 관심이 급증했다. 레일즈는 루비에 대한 인지도를 높이는 데 기여한 것으로 자주 언급된다.
2011년 10월 31일에 출시된 루비 1.9.3부터 루비는 루비 라이선스와 GPL 하에 이중 라이선스를 부여하는 방식에서 루비 라이선스와 두 조항의 BSD 라이선스 하에 이중 라이선스를 부여하는 방식으로 변경되었다. 1.9의 채택은 1.8에서 변경된 사항으로 인해 많은 인기 있는 타사 젬을 다시 작성해야 하면서 지연되었다. 루비 1.9는 1.8 시리즈에 비해 많은 중요한 변경 사항을 도입했다.
- 블록 지역 변수 (선언된 블록에 지역적인 변수)
- 추가적인 람다 구문
- 심볼 키에 콜론을 사용하는 추가적인 해시 리터럴 구문
- 문자열별 문자 인코딩 지원
- 새로운 소켓 API ([
IPv6 지원]) - `require_relative` 가져오기 보안
2. 4. Ruby 2 (2013년 ~ 2019년)
Ruby 2.0은 2013년 2월 24일에 공식 출시되었으며, Ruby 1.9.3과의 완전한 하위 호환성을 목표로 했다. 이 버전에서는 다음과 같은 새로운 기능이 추가되었다.- 메서드 키워드 인수
- 클래스 확장을 위한 새로운 메서드 `Module#prepend`
- 심볼 배열 생성을 위한 새로운 리터럴
- Enumerables의 지연 평가를 위한 새로운 API
- 객체를 해시로 변환하기 위해 `#to_h`를 사용하는 새로운 규칙
2.1.0부터 Ruby의 버전 관리 정책은 시맨틱 버전과 유사하게 변경되었다.
Ruby 2.2.0에는 속도 향상, 버그 수정, 라이브러리 업데이트와 함께 일부 사용 중단된 API가 제거되었다. 특히, 점진적 가비지 수집기, 심볼의 가비지 수집 지원, jemalloc에 직접 컴파일하는 옵션 등 메모리 처리에 대한 변경 사항이 도입되었다. 또한 vfork(2)를 system() 및 spawn()과 함께 사용하는 것에 대한 실험적 지원과 유니코드 7.0 사양에 대한 지원이 추가되었다. Ruby 2.2.1부터 Ruby MRI의 PowerPC64 성능이 개선되었다.
Ruby 2.3.0에는 많은 성능 개선, 업데이트 및 버그 수정이 포함되었다. 주요 변경 사항은 다음과 같다.
- 모든 문자열 리터럴을 기본적으로 고정하여 문자열 연산 성능 향상
- 키/값 쌍을 직접 확인할 수 있도록 해시 비교 기능 개선
- `&.`라는 새로운 안전 탐색 연산자를 통해 nil 처리 용이 (예: `if obj && obj.foo && obj.foo.bar` 대신 `if obj&.foo&.bar` 사용 가능)
- ''did_you_mean'' 젬 기본 제공, ''NameError'' 또는 ''NoMethodError'' 발생 시 유사한 이름 자동 제안
- ''Hash#dig'' 및 ''Array#dig''를 통해 깊이 중첩된 값을 쉽게 추출 (예: `profile.dig(:social, :wikipedia, :name)`로 ''Foo Baz'' 값 검색)
- 주어진 정규 표현식의 모든 부정적 사례와 일치하는 `.grep_v(regexp)`
Ruby 2.4.0에는 해시 테이블, Array#max, Array#min 및 인스턴스 변수 접근에 대한 성능 개선이 이루어졌다. 기타 주요 변경 사항은 다음과 같다.
- Binding#irb: binding.pry와 유사한 REPL 세션 시작
- ''Fixnum''과 ''Bignum''을 ''Integer'' 클래스로 통합
- 문자열의 유니코드 대/소문자 매핑 지원
- Regexp#match?라는 새로운 메서드 (Regexp#match의 더 빠른 부울 버전)
- 스레드 데드락 감지 기능 개선 (백트레이스 및 종속성 표시)
Ruby 2.5.0에서는 ''rescue'' 및 ''ensure'' 문에서 자동으로 주변 ''do-end'' 블록을 사용하고, ''yield_self''를 사용한 메서드 체이닝, 분기 커버리지 및 메서드 커버리지 측정을 지원하며, ''Hash#slice'' 및 ''Hash#transform_keys''를 통해 해시 변환이 쉬워졌다. 또한 블록 전달 속도 향상(3배 빠름), 더 빠른 뮤텍스, 더 빠른 ERB 템플릿 및 일부 연결 메서드 개선 등 성능 향상이 이루어졌다.
Ruby 2.6.0에서는 실험적인 JIT 컴파일러와 ''RubyVM::AbstractSyntaxTree''(실험적)가 도입되었다.
Ruby 2.7.0에서는 패턴 매칭(실험적), REPL 개선, 압축 GC, 위치 인수와 키워드 인수의 분리 등의 변경 사항이 있었다.
2. 5. Ruby 3 (2020년 ~ 현재)
Ruby 3.0.0은 2020년 크리스마스에 출시되었다. "Ruby 3x3"으로 알려져 있으며, 이는 Ruby 3.0에서 프로그램이 Ruby 2.0보다 3배 더 빠르게 실행될 것임을 의미한다.[1] 이를 위해 Ruby 3에는 MJIT, 이후에는 YJIT와 같은 즉시 컴파일러(JIT)가 제공되어 프로그램을 더 빠르게 만들지만, 실험적인 기능으로 설명되고 기본적으로 비활성화된 상태로 유지된다(런타임에 플래그로 활성화).Ruby 3.0의 또 다른 목표는 동시성을 개선하는 것이며, Fiber Scheduler 및 실험적인 Ractor라는 두 가지 기능이 이 목표를 달성하는 데 기여한다. Ractor는 공유 객체 대신 메시지를 교환하여 구현되므로 가볍고 스레드 안전하다.
Ruby 3.0은 정적 분석을 위해 Ruby 프로그램의 타입을 설명하는 RBS 언어를 도입했다. 이는 일반 Ruby 프로그램과 분리되어 있다. Ruby 3.0에는 몇 가지 구문 개선 사항과 라이브러리 변경 사항도 있다.
Ruby 3.1은 2021년 12월 25일에 출시되었다. 여기에는 Shopify에서 개발한 새로운 실험적인 즉시 컴파일러인 YJIT가 포함되어 실제 비즈니스 애플리케이션의 성능을 향상시킨다. 새로운 디버거도 포함되어 있다. 이 릴리스에는 몇 가지 구문 개선 사항과 기타 개선 사항이 있다. FTP, SMTP, IMAP, POP에 대한 네트워크 라이브러리는 기본 젬에서 번들 젬으로 이동되었다.[2]
Ruby 3.2는 2022년 12월 25일에 출시되었다.[3] 이는 WASI 인터페이스를 통해 WebAssembly 환경 내에서 실행할 수 있는 지원을 제공한다. 정규 표현식도 개선되어 특정 ReDoS 공격으로부터 보호하기 위한 더 빠르고 메모이제이션된 일치 알고리즘과 정규 표현식 일치에 대한 구성 가능한 시간 초과가 포함되었다. 구문 제안 및 오류 강조 표시를 포함한 추가 디버깅 및 구문 기능도 이 릴리스에 포함되어 있다. MJIT 컴파일러는 표준 라이브러리 모듈로 재구현되었으며, Rust 기반 JIT 컴파일러인 YJIT는 이제 Linux에서 더 많은 아키텍처를 지원한다.
Ruby 3.3은 2023년 12월 25일에 출시되었다.[4] Ruby 3.3은 언어에 대한 상당한 향상과 성능 개선을 도입했다. 주요 기능으로는 휴대성과 유지 관리가 가능한 구문 분석을 위한 Prism 파서 도입, 순수 Ruby JIT 컴파일러 RJIT 추가, YJIT 컴파일러의 주요 성능 향상이 있다. 또한 메모리 사용량 개선, M:N 스레드 스케줄러 도입 및 표준 라이브러리 업데이트는 보다 효율적이고 개발자 친화적인 Ruby 생태계에 기여한다.
3. 철학 및 설계 사상
마쓰모토 유키히로는 루비가 스트레스 없는 쉬운 프로그래밍을 추구하며, (컴퓨터가 아닌) 인간 중심으로 설계되어야 한다고 강조했다. 그는 프로그래머의 생산성과 즐거움을 위해 루비를 설계했다고 말했다.
마쓰모토는 루비 설계에 최소 놀람 원칙 (POLA)을 적용하지 않았다고 밝혔다. 그는 모든 설계 선택이 누군가에게는 놀라움을 줄 수 있기 때문에, 놀라움을 평가하는 데 개인적인 기준을 사용한다고 설명했다. 그는 인터뷰에서 다음과 같이 덧붙였다.
루비는 객체 지향 프로그래밍 언어이다. 루비에서 모든 값은 객체이며, 정수, 부울, null과 같은 유형도 클래스와 인스턴스를 가진다. 루비의 모든 것은 객체이므로, 모든 것은 메서드라고 하는 내장 기능을 가진다. 모든 함수는 메서드이며, 메서드는 항상 객체에서 호출된다. 최상위 범위에서 정의된 메서드는 Object 클래스의 메서드가 되며, 이는 다른 모든 클래스의 상위 클래스이므로 모든 객체에서 호출할 수 있다. 루비는 상속을 동적 디스패치, 믹스인, 단일톤 메서드와 함께 지원한다. 루비는 다중 상속을 지원하지 않지만, 클래스는 모듈을 믹스인으로 가져올 수 있다.
루비는 다중 패러다임 프로그래밍 언어로 묘사된다. 객체 지향 프로그래밍 (모든 것이 객체), 함수형 프로그래밍 (익명 함수, 클로저, 지속) 또는 절차적 프로그래밍을 허용한다. 루비는 내관, 반사 프로그래밍, 메타프로그래밍, 인터프리터 기반 스레드를 지원한다. 또한 동적 타이핑을 제공하며 매개변수 다형성을 지원한다.
루비 FAQ에 따르면, 구문은 Perl과 유사하고 의미는 스몰토크와 유사하지만, 설계 철학은 파이썬과는 크게 다르다. 마쓰모토 유키히로는 "Ruby의 언어 사양을 제정하는 데 있어서 가장 중요하게 생각하는 것은 스트레스 없이 프로그래밍을 즐기는 것 (''enjoy programming'')이다"라고 말한다.
펄의 모토 "다양한 방법이 있다 (''There's More Than One Way To Do It; TMTOWTDI'')"는 "다양성은 좋다 (''Diversity is Good'')"라는 슬로건으로 루비에 계승되었지만, 가장 중요한 것은 아니라고 언급하며, 권장되지 않는 기법도 가능하게 함과 동시에, 그러한 기법을 언어 사양으로 사용하기 어렵게 함으로써 자제를 촉구하고 있다.
영어권 개발자들 사이에서는 '''MINASWAN''' (Matz is nice and so we are nice. 한국어 번역: 마츠모토가 멋지니 우리도 멋지게)라는 표어가 사용되고 있다.
4. 특징
루비는 객체 지향 프로그래밍 언어이다. 정수, 문자열 등 모든 데이터 타입은 객체로 취급되며, 다른 많은 언어가 기본형으로 지정하는 유형(예: 정수, 부울 및 "null")의 클래스와 인스턴스를 포함한다. 모든 함수는 메서드이며 메서드는 항상 객체에서 호출된다. 최상위 범위에서 정의된 메서드는 Object 클래스의 메서드가 된다. 이 클래스는 다른 모든 클래스의 상위 클래스이므로 이러한 메서드는 모든 객체에서 호출할 수 있다. 또한 모든 범위에서 볼 수 있으며 효과적으로 "전역" 프로시저 역할을 한다.
루비는 상속을 동적 디스패치, 믹스인 및 단일톤 메서드(클래스에서 정의되는 대신 단일 인스턴스에 속하고 해당 인스턴스에 대해 정의됨)와 함께 지원한다. 루비는 다중 상속을 지원하지 않지만, 클래스는 모듈을 믹스인으로 가져올 수 있다.
루비는 동적 타이핑 및 덕 타이핑을 지원하여, 변수의 타입을 미리 선언하지 않아도 되므로 유연하고 빠르게 개발할 수 있다.
구문적 잡음을 최소화하고 도메인 특화 언어의 기반 역할을 하는 간결하고 유연한 구문을 제공하여, 코드 작성 및 이해가 용이하다.
동적 반사 및 객체 변경을 통해 메타 프로그래밍을 지원하여, 코드 실행 중에 클래스나 객체의 구조를 동적으로 변경할 수 있다.
렉시컬 클로저, 반복자 및 제너레이터 및 블록 구문을 지원하여, 코드를 간결하고 효율적으로 작성할 수 있다.
배열, 해시, 정규 표현식 및 심볼에 대한 리터럴 표기법을 제공한다.
가비지 컬렉션, 예외 처리, 스레드 등 안정적인 프로그램 개발을 위한 기능을 제공한다.
5. 문법
루비의 문법은 펄 및 파이썬과 유사하다. 클래스와 메서드 정의는 키워드로 표시되며, 코드 블록은 키워드 또는 중괄호(`{}`)로 정의할 수 있다. 펄과 달리 변수는 시길을 필수로 사용하지 않아도 되지만, 시길을 사용할 경우 변수의 범위가 변경된다. 루비는 모든 인스턴스 변수를 클래스에 완전히 비공개로 유지하고 `attr_writer`, `attr_reader` 등의 접근자 메서드를 통해서만 노출한다. 이러한 접근자 메서드는 메타 프로그래밍을 통해 한 줄의 코드로 생성할 수 있어, C++나 자바의 "getter", "setter" 메서드와 달리 간편하다.
5. 1. 제어 구조
다른 언어에서도 흔히 볼 수 있는 제어 구조를 사용할 수 있다.[4]루비 코드 | 설명 |
---|---|
위의 코드 예제에서 `if` 문은 다음과 같이 다양하게 표현할 수 있다.
루비 코드 | 설명 |
---|---|
일부 제어 구조는 반복자(Iterator)로 대체할 수 있다.[4]
{| class="wikitable"
|-
! 루비 코드
! 설명
|-
|
```ruby
list = [1, 2, 5, 13, 21]
list.map!
5. 2. 문자열
루비는 다양한 방법으로 문자열을 정의할 수 있으며, 변수 보간(Variable interpolation)을 지원한다.다음의 할당은 동일하며 변수 보간을 지원한다.
```ruby
a = "\nThis is a double-quoted string\n"
a = %Q{\nThis is a double-quoted string\n}
a = %{\nThis is a double-quoted string\n}
a = %/\nThis is a double-quoted string\n/
a = <<-BLOCK
This is a double-quoted string
BLOCK
```
다음의 할당은 동일하며 원래 그대로의 문자열(raw string)을 산출한다.
```ruby
a = 'This is a single-quoted string'
a = %q{This is a single-quoted string}
5. 3. 컬렉션
rubya = [1, 'hi', 3.14, 1, 2, [4, 5]]
puts a[2] # 3.14
puts a.[](2) # 3.14
puts a.reverse #
puts a.flatten.uniq # [1, 'hi', 3.14, 2, 4, 5]
```
루비에서 해시라 불리는 연관 배열(associative array)을 사용하여 구성할 수 있다.
```ruby
hash = { :water => 'wet', :fire => 'hot' }
puts hash[:fire] # hot 출력
hash.each_pair do |key, value| # 또는 hash.each do |key, value| 사용 가능
puts "#{key} is #{value}"
end
# 출력: water is wet
# fire is hot
hash.delete :water # :water => 'wet' 삭제
hash.delete_if
5. 4. 블록(Block)과 반복자(Iterator)
코드 블록은 중괄호(`{}`) 또는 `do...end`로 둘러싸인 코드 영역으로, 메서드 호출 시 함께 전달하여 특정 작업을 수행할 수 있다.[15] 블록을 사용하여 반복 처리, 후처리 간소화, 클로저 등 다양한 기능을 구현할 수 있다.코드 블록을 생성하는 두 가지 방법은 다음과 같다.
```ruby
{ puts "Hello, World!" } # 중괄호를 사용
```
또는
```ruby
do
puts "Hello, World!"
end
```
두 가지 방법은 기본적으로 동일하지만 결합 우선 순위가 다르다. 관습적으로 한 줄로 작성할 때는 중괄호를 사용하고, 여러 줄에 걸쳐 작성할 때는 `do...end`를 사용하는 경우가 많다.[15]
```ruby
# { ... }
method1 { puts "Hello, World!" }
# do ... end
method2 do
puts "Hello, world!"
end
```
블록을 사용하여 배열(Array) 등을 반복할 수 있다.
```ruby
array = [1, 'hi', 3.14]
array.each {|item| puts item }
# => 1
# => 'hi'
# => 3.14
array.each_index {|index| puts "#{index}: #{array[index]}" }
# => 0: 1
# => 1: 'hi'
# => 2: 3.14
# 범위를 사용
(3..6).each {|num| puts num }
# => 3
# => 4
# => 5
# => 6
```
블록이 있는 메서드 호출은 반복 처리를 주로 하는 역할 때문에 이터레이터라고 불리던 시기가 있었다. 그러나 실제로는 반복 처리뿐만 아니라 다양한 방식으로 사용되기 때문에, 최근에는 블록이 있는 메서드 호출 전체를 통칭하여 이터레이터라고 부르는 것은 적절하지 않다고 여겨진다.[15]
클로저가 되는 블록의 인자를 전달하는 예시는 다음과 같다.
```ruby
# 객체의 인스턴스 변수(변수명 앞에 @가 붙음)로 블록을 기억한다.
def remember(&p)
@block = p
end
# name을 받는 블록을 인수로 위의 메서드를 호출한다.
remember {|name| puts "Hello, " + name + "!"}
# 나중에 필요하게 되었을 때 클로저를 호출한다.
@block.call("John")
# 표시:"Hello, John!"
```
메서드에서 클로저를 반환하는 예시는 다음과 같다.
```ruby
def create_set_and_get(value = 0)
return proc
5. 5. 클래스
루비는 클래스 기반 객체 지향 언어이며, `class` 키워드를 사용하여 클래스를 정의한다.```ruby
class Person
attr_reader :name, :age # Getter
def initialize(name, age)
@name, @age = name, age
end
def <=>(person) # 정렬을 위한 비교 연산자
@age <=> person.age
end
def to_s # 객체를 String으로 바꾸기 위한 메서드
"#{@name} (#{@age})"
end
end
group = [
Person.new("John", 20),
Person.new("Markus", 63),
Person.new("Ash", 16)
]
puts group.sort.reverse
```
위 코드는 `Person`이라는 클래스를 정의하고 있다.
- `initialize` 메서드는 객체를 초기화하는 생성자이다.
- `<=>` 메서드는 비교 연산자로, `Array#sort`에서 `age` 속성을 기준으로 정렬하는 데 사용된다.
- `to_s` 메서드는 `Kernel#puts`에서 객체를 출력할 때 형식을 지정한다.
- `attr_reader`는 인스턴스 변수의 값을 읽는 `getter` 메서드를 정의하는 메타 프로그래밍 예시이다.
- `attr`은 인스턴스 변수의 값을 읽고 쓰는 `getter`와 `setter` 메서드(접근자)를 정의한다.
- `attr_reader`는 `getter` 메서드만 정의한다.
- 메서드 안에서 마지막으로 평가된 식이 반환값이 되므로, 명시적으로 `return`을 사용하지 않아도 된다.
위 코드의 실행 결과는 다음과 같다.
```text
Markus (63)
John (20)
Ash (16)
```
세 개의 이름이 나이 순으로 정렬되어 출력된다.
루비는 모든 인스턴스 변수를 클래스 내부에 비공개로 유지하고, 접근자 메서드(`attr_writer`, `attr_reader` 등)를 통해서만 접근할 수 있도록 한다. C++이나 자바의 "getter" 및 "setter" 메서드와 달리, 루비의 접근자 메서드는 메타 프로그래밍을 통해 한 줄의 코드로 생성할 수 있다.
5. 6. 예외 처리
rubybegin
# 일반 처리
rescue
# 예외 처리. 인수를 생략하면 StandardError의 서브클래스 예외만 처리한다.
rescue SomeError
# 예외 처리. SomeError의 예외만 처리한다.
ensure
# 예외 발생에 관계없이 반드시 실행되는 처리
else
# 예외가 발생하지 않았을 때 실행되는 처리
end
```
루비에서 예외는 `begin...rescue...ensure...else` 구문을 사용하여 처리할 수 있다. 문제가 발생했을 때 `raise` 호출로 예외를 발생시킬 수 있다. 루비에서의 예외는 `Exception` 클래스 또는 그 서브클래스의 인스턴스이다.
예외에는 메시지를 추가할 수도 있다.
```ruby
raise "This is a message"
```
또한 예외의 유형도 지정할 수 있다.
```ruby
raise ArgumentError, "Illegal arguments!"
5. 7. 메타프로그래밍
루비는 메타 프로그래밍을 지원하여, 런타임에 클래스나 객체의 구조를 변경하거나 새로운 메서드를 동적으로 생성할 수 있다. 예를 들어, 다음 코드는 문자열에 특정 색깔을 입히는 메서드를 동적으로 생성한다.COLORS = { :black => "000",
:red => "f00",
:green => "0f0",
:yellow => "ff0",
:blue => "00f",
:magenta => "f0f",
:cyan => "0ff",
:white => "fff" }
class String
COLORS.each do |color,code|
define_method "in_#{color}" do
"#{self}"
end
end
end
이렇게 생성된 메서드는 다음과 같이 사용할 수 있다.
"Hello, World!".in_blue
=> "Hello, World!"
루비는 모든 인스턴스 변수를 클래스에 완전히 비공개로 유지하고 접근자 메서드(
attr_writer
, attr_reader
등)를 통해서만 노출한다. C++ 또는 자바와 같은 다른 언어의 "getter" 및 "setter" 메서드와 달리, 루비의 접근자 메서드는 메타 프로그래밍을 통해 한 줄의 코드로 생성할 수 있다.5. 8. 공식 구현
MRI(Matz' Ruby Implementation)는 마츠모토 유키히로가 개발을 시작한 C 언어 기반의 구현으로, 가장 널리 사용된다. 좁은 의미로는 eval을 중심으로 한 부분이 YARV로 갱신되기 전(1.8.x 이전) 버전을 지칭하기도 한다. JRuby 등에 대해 CRuby라고 불리기도 하며, YARV 이후를 포함하는 넓은 의미로도 사용된다.[4]YARV(Yet Another Ruby VM)는 1.9 버전부터 채택된 가상 머신으로, MRI의 eval을 바이트코드를 실행하는 방식으로 대체했다. (좁은 의미의) MRI는 소스 코드를 구문 트리로 컴파일한 후, 구문 트리를 해석하는 가상 머신인 eval로 실행하는 인터프리터이지만, YARV는 소스 코드를 바이트코드로 컴파일한 후, 바이트코드를 해석하는 가상 머신인 eval로 실행하는 인터프리터이다. Java 등의 바이트코드와는 달리, 이 바이트코드는 파일로 생성되지 않는다(파일로 정적으로 외부화하는 것을 고려한 설계는 기본적으로 없으며, 심볼을 다용하는 등). "YARV"는 원래 개발 중 가상 머신의 이름이었다.[4]
5. 9. 기타 구현
- JRuby: 자바 가상 머신에서 실행되는 자바와 루비의 혼합 구현이다. JRuby는 현재 루비 3.1.x를 타겟으로 한다. 자바 언어로 구현되어 플랫폼에 독립적으로 사용할 수 있으며, 대부분의 루비 클래스가 내장되어 있다. 인터프리터, 런타임 컴파일러, 사전 컴파일러의 3가지 유형이 있다. 사전 컴파일러는 자바 바이트 코드로 변환하여 JRuby가 없어도 다른 자바 플랫폼에서 작동할 수 있다.
- IronRuby: .NET Framework에서 루비를 실행하는 구현으로, .NET 프레임워크의 라이브러리와 연동할 수 있다. JIT 방식의 바이트코드 인터프리터이다. 공통 언어 인프라를 준수하는 구현(모노 등)에서 작동하므로 플랫폼에 독립적으로 사용할 수 있다(단, 소스 코드가 .NET 프레임워크의 라이브러리에 의존하는 경우 모노에서의 작동은 불가능하다).
- MacRuby: macOS에서 작동하는 루비 구현이다. 코코아를 포함한 다양한 프레임워크와 연동할 수 있다. RubyCocoa의 문제점을 해결하기 위해 개발되었다.
- Rubinius: 가상 머신에서 루비를 실행하는 JIT 방식의 바이트코드 인터프리터이다. 대부분이 루비로 구현되어 있다.
- MagLev: 스몰토크 가상 머신에서 작동하는 구현이다. [https://maglev.github.io MagLev]
- mruby: 임베디드 시스템용 경량 버전이다. 가전 제품 외에, 스마트폰, 비디오 게임 등에서의 사용을 상정하고 있다.
- TruffleRuby: GraalVM과 함께 Truffle 언어 구현 프레임워크를 사용하는 자바 구현이다.
- RGSS: 루비 게임 스크립팅 시스템은 게임 디자인 및 RPG Maker 엔진의 수정을 위해 RPG Maker 시리즈 소프트웨어에서 사용되는 독점 소프트웨어 구현이다.
- julializer: 루비에서 Julia로의 트랜스파일러 (부분)이다. 이는 루비 또는 JRuby 구현보다 훨씬 빠른 속도를 낼 수 있다 (수치 코드에만 유용할 수 있음).
- Topaz: 파이썬으로 작성된 루비 구현이다.
- Opal: 루비를 자바스크립트로 컴파일하는 웹 기반 인터프리터이다.
- 기타: 패럿에서 루비를 작동시키기 위한 구현 등도 개발되고 있다.
6. 활용
루비는 웹 개발, 스크립트 작성, 시스템 관리, 게임 개발 등 다양한 분야에서 활용된다.
웹 개발 분야에서는 특히 루비 온 레일즈 프레임워크가 널리 사용된다. 데이비드 하이네마이어 한손이 개발한 루비 온 레일즈는 생산성과 유연성이 뛰어나 깃허브, Metasploit, 레드마인 등 다양한 웹 서비스 개발에 활용되었다.
tDiary, Hiki, Chef, Vagrant, Puppet 등 여러 오픈 소스 프로젝트도 루비로 개발되었다. 또한, 게임 제작 소프트웨어인 RPG 쯔꾸르 XP, RPG 쯔꾸르 VX 등에서 스크립트 언어로 채택되어 게임 개발에도 활용되었다.
6. 1. 루비 온 레일즈(Ruby on Rails)
데이비드 하이네마이어 한손이 구축한 Ruby on Rails는 루비로 작성된 웹 애플리케이션 프레임워크이다.[19] 깃허브, Metasploit, 레드마인, Basecamp, RadiantCMS 등이 루비 온 레일즈를 기반으로 한다. 데이비드 하이네마이어 한손은 Quora에서 파이썬을 선택하지 않은 이유에 대해 "저는 루비와 사랑에 빠졌고, 벌써 14년이나 그렇게 지내왔습니다. (중략) '최적의 도구'라는 것은 존재하지 않습니다. 당신의 뇌를 적절하게 자극하는 퍼즐이 있을 뿐입니다."라고 답했다.[19]6. 2. 기타 활용 분야
tDiary, Hiki, 레드마인, Chef, Vagrant, Puppet 등 다양한 오픈 소스 프로젝트가 루비로 개발되었다. 주식회사 엔터브레인에서 발매된 게임 제작 소프트웨어 시리즈인 RPG 쯔꾸르 XP와 RPG 쯔꾸르 VX에서는 루비를 쯔꾸르 전용으로 커스터마이즈한 RGSS를 탑재하여, 사용자가 전투 등의 시스템을 직접 구축할 수 있게 하였다. RPG 쯔꾸르 MV부터는 개발 언어가 JavaScript로 변경되었다.[1]7. 루비와 한국
루비는 일본에서 개발된 언어이지만, 대한민국에서도 루비 온 레일즈를 중심으로 웹 개발 분야에서 널리 사용되고 있다. 한국어로 된 루비 관련 서적과 커뮤니티가 활발하게 운영되고 있으며, 루비 개발자 컨퍼런스도 개최되고 있다. 더불어민주당은 IT 정책에서 오픈 소스 소프트웨어 활용을 강조하며, 루비와 같은 오픈 소스 기술의 중요성을 인식하고 있다.
8. 비판 및 논쟁
루비는 마츠모토 유키히로가 프로그래머의 생산성과 즐거움을 위해 설계한 언어이다. 마츠모토는 시스템 설계가 컴퓨터보다는 인간의 필요에 중점을 두어야 한다고 강조했다. 그는 프로그래머의 작업과 혼란을 최소화하는 것을 목표로 루비를 설계했다고 말했다.
마츠모토는 루비 설계에 최소 놀람 원칙 (POLA)을 적용하지 않았다고 밝혔다. 그는 모든 설계 선택이 누군가에게는 놀라움을 줄 수 있기 때문에, 놀라움을 평가하는 데 개인적인 기준을 사용한다고 설명했다.
루비는 객체 지향 프로그래밍 언어이다. 모든 값은 객체이며, 함수는 메서드로 객체에서 호출된다. 루비는 상속, 믹스인, 메타프로그래밍 등을 지원하며, 다중 패러다임 프로그래밍 언어로 묘사된다. 내관, 반사 프로그래밍 또한 지원한다. 루비는 동적 타이핑 기능을 제공하며 매개변수 다형성을 지원한다.
루비 FAQ에 따르면, 구문은 Perl과 유사하고 의미는 스몰토크와 유사하지만 설계 철학은 파이썬과는 크게 다르다.
8. 1. "루비는 죽었다" 논쟁
루비는 종종 "죽었다"라는 비판을 받기도 하지만, 여전히 많은 분야에서 활발하게 사용되고 있다. 트위터가 루비 온 레일스에서 자바 가상 머신용 언어인 스칼라로 전환한 사례 등은 "루비의 죽음"을 주장하는 근거로 제시되기도 한다.[1] 그러나 루비와 루비 온 레일즈는 여전히 다양한 분야에서 적용 사례를 찾아볼 수 있다.[1]TIOBE 프로그래밍 언어 인기 순위에서 루비가 낮은 순위를 기록하는 것을 두고 "루비가 쇠퇴하고 있다"는 주장이 제기되기도 하지만, 실제 비즈니스 환경에서는 여전히 루비의 가치가 높게 평가되는 경우가 많다.[1] 마츠모토는 다음과 같이 말한다. "루비나 루비 온 레일스의 경우, 다양한 분야에서 실제 적용 사례가 있기 때문에, 뭔가 곤란한 일이 있을 때 같은 문제에 직면한 사람을 찾거나, 혹은 그 문제를 해결하는 루비젬을 찾을 수 있다. 그런 점에서 보면, 총 생산성은 꽤 높은 경우가 있다", "실제로 일로서, 혹은 자신의 제품을 만들 때, 어떤 언어를 선택하고 어떻게 개발해야 할지를 생각하면, 루비가 가진 비즈니스상의 가치는 그렇게 떨어지지 않았다고 생각한다. 설령 순위가 내려가고, 겉으로 루비의 인기가 쇠퇴한 것처럼 보여도, 어떤 의미에서는 '아직 괜찮다'가 하나의 견해라고 생각한다."[1]
8. 2. 성능 문제
루비는 인터프리터 형식으로 실행되는 고기능 스크립트 언어이므로, 벤치마크 테스트에서 특정 코드를 실행하면 처리 속도가 현저하게 저하될 수 있다.[8] 이는 컴파일 언어에 비해 실행 속도가 느리다는 단점으로 지적될 수 있다. 하지만 루비 3.0 이후 JIT 컴파일러 도입 등 지속적인 성능 개선 노력을 통해 이러한 단점을 극복하고 있다.일본에서는 루비의 인기가 높고 관련 서적도 많이 출판되고 있다.[8]
참조
[1]
웹사이트
Ruby 3x3: Matz, Koichi, and Tenderlove on the future of Ruby Performance
https://blog.heroku.[...]
2016-11-10
[2]
웹사이트
Ruby 3.1.0 Released
https://www.ruby-lan[...]
2021-12-26
[3]
웹사이트
Ruby 3.2.0 Released
https://www.ruby-lan[...]
2022-12-25
[4]
웹사이트
Ruby 3.3.0 Released
https://www.ruby-lan[...]
2023-12-25
[5]
웹사이트
Stats RubyGems.org your community gem host
https://rubygems.org[...]
2021-12-10
[6]
문서
Intro - D Programming Language 1.0 - Digital Mars
http://www.digitalma[...]
[7]
웹사이트
RDoc Documentation
https://ruby-doc.org[...]
2023-12-15
[8]
간행물
プログラム言語Ruby、国際規格として承認
https://www.ipa.go.j[...]
独立行政法人情報処理推進機構
2012-04-02
[9]
웹사이트
Ruby用語集(Ruby 2.7.0 リファレンスマニュアル)
https://docs.ruby-la[...]
2020-02-07
[10]
웹사이트
Ruby License
https://www.ruby-lan[...]
ruby-lang.org
2020-09-29
[11]
웹사이트
Tech通信
https://www.tech-tsu[...]
2019-03-01
[12]
논문
オープンソースのプログラミング言語Rubyによる地域産業振興
https://www.jstage.j[...]
2013
[13]
웹사이트
まつもとゆきひろさん「Ruby3の目指す未来 –The Year of Concurrency–」〜RubyKaigi 2019 1日目 基調講演
https://gihyo.jp/new[...]
2019-05-14
[14]
웹사이트
Rubyのクラスと定数の先頭をアルファベット大文字に限定しているのはなぜですか?クラス名を日本語にできないのが他の言語ではできるので少し惜しい気がします。
https://jp.quora.com[...]
Quora
null
[15]
문서
'{{Bracket|ruby-list:39878}} Re: イテレータとfor文'
http://blade.nagaoka[...]
[16]
서적
Emacs実践入門 思考を直感的にコード化し、開発を加速する
技術評論社
2012-04-05
[17]
문서
まつもとゆきひろ 「探訪 Ruby 第6回」『Linux Magazine』56号、[[アスキー (企業)|株式会社アスキー]]、2004年。
[18]
문서
“Rubyは死んだ”のか?まつもとゆきひろ氏が語る「プログラミング言語サバイバル」とRubyの未来 - Part1 - ログミーTech
https://logmi.jp/tec[...]
[19]
문서
Rails Ruby on Rails作者のデイヴィッド・ハイネマイヤー・ハンソンはRailsを構築するのに(Pythonではなく)、なぜRubyを選んだのでしょうか? - Quora
https://jp.quora.com[...]
[20]
웹사이트
Rubyレベルのプログラミング言語はどのくらいの部分が発明者だけによるコードなのでしょうか?
https://jp.quora.com[...]
Quora
2020-09-08
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com